feat: let a project supply its own chat bridge and resume jobs without an inbox - #1850
feat: let a project supply its own chat bridge and resume jobs without an inbox#1850radu-mocanu wants to merge 1 commit into
Conversation
…t an inbox a conversational agent can only speak to the conversational agent service today. projects can now name a chatBridge in uipath.json and reach any surface, and a job that suspended without an api trigger can be resumed at the job level.
There was a problem hiding this comment.
Pull request overview
This PR extends the UiPath Python SDK/CLI to (1) allow projects to plug in a custom chat bridge via uipath.json so conversational agents can run against non-CAS surfaces (e.g., Slack/Teams/webhooks) both locally and when deployed, and (2) add a new Orchestrator jobs API to resume suspended jobs that have no “inbox” (common for conversational exchanges that end suspended).
Changes:
- Add
chatBridgetouipath.jsonschema and resolve/load a project-provided bridge factory at runtime. - Update
uipath runexecution flow to use the project chat bridge even when not running under a platform job. - Add
jobs.resume_job/resume_job_asyncand tests for resuming a suspended job by key without an inbox.
Reviewed changes
Copilot reviewed 7 out of 9 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/uipath/uv.lock | Bumps local editable package versions for the uipath workspace. |
| packages/uipath/src/uipath/_cli/models/uipath_json_schema.py | Adds chatBridge (chat_bridge) to the uipath.json schema model. |
| packages/uipath/src/uipath/_cli/cli_run.py | Resolves and wires a project-provided chat bridge into run execution (not tied to jobs). |
| packages/uipath/src/uipath/_cli/_chat/_custom.py | New dynamic loader for a project-supplied chat bridge factory. |
| packages/uipath/pyproject.toml | Bumps uipath version. |
| packages/uipath-platform/uv.lock | Updates lock metadata and bumps uipath-platform editable version. |
| packages/uipath-platform/tests/services/test_jobs_service.py | Adds coverage for the new resume-by-job-key API behavior. |
| packages/uipath-platform/src/uipath/platform/orchestrator/_jobs_service.py | Adds resume_job / resume_job_async and a new request spec for ResumeJob. |
| packages/uipath-platform/pyproject.toml | Bumps uipath-platform version. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if not spec: | ||
| return None | ||
| bridge = _load_factory(spec)(context) |
| if not path.is_file(): | ||
| raise UiPathChatBridgeError(f"chatBridge file not found: {path}") | ||
|
|
||
| module_name = f"_uipath_chat_bridge_{path.stem}" |
| module = importlib.util.module_from_spec(module_spec) | ||
| sys.modules[module_name] = module | ||
| module_spec.loader.exec_module(module) |
| # A project's own bridge is not tied to a platform job, | ||
| # so it works the same locally and deployed. | ||
| custom_bridge = resolve_chat_bridge( | ||
| UiPathJsonConfig.load_from_file().chat_bridge, ctx | ||
| ) |
| def resolve_chat_bridge( | ||
| spec: str | None, context: UiPathRuntimeContext | ||
| ) -> UiPathChatProtocol | None: | ||
| """Build the project's own chat bridge, if it declared one and it wants this run. |
|
🚨 Heads up:
|


Summary
chatBridgeinuipath.jsonasfile_path:factory_name. the factory receives the runtime context and returns aUiPathChatProtocol, orNoneto decline and leave the conversational agent service in chargejobs.resume_job/resume_job_async, which resume a suspended job by key with input argumentsWhy
a conversational agent can only be spoken to through the conversational agent service today. everything the runtime needs to reach another surface is already framework agnostic: every runtime emits
UiPathConversationMessageEvents andUiPathChatRuntimeconsumes them throughUiPathChatProtocol. only the factory was hardcoded, so langchain, llamaindex and coded agents all gain slack, teams or a webhook with no per-framework code.jobs.resumedelivers a payload to a job's inbox, which only exists when the job suspended on an api resume trigger. a conversational exchange ends suspended carrying no interrupt and therefore has no inbox, so it could not be resumed from the sdk at all.Development Packages
uipath
uipath-platform